package com.bdqn.ch04.SL;


import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * JedisAPI
 * 示例1 连接池的配置
 * @aurhor Administrator  whs
 * @since 2024/7/8
 */
public class JedisAPI {

    private static JedisPool jedisPool;

    static {

        //创建并设置连接池对象
        JedisPoolConfig config = new JedisPoolConfig();
        config.setMaxTotal(50);  // 连接池最大连接数 ， 默认为8
        config.setMaxIdle(10);  //  连接池中的最大空闲连接，默认为8
        config.setMinIdle(7);    // 连接池的最小空闲连接，默认为0
        config.setMaxWaitMillis(1000); // 获取资源的等待时间
        config.setTestOnBorrow(true);  // 获取资源是是否验证资源的有效性

        jedisPool = new JedisPool(config, // 连接池配置对象
                "127.0.0.1",  // Redis服务器地址
                6379,            // Redis 服务端口
                10000,           // 连接超时时间，单位毫秒，默认为2000ms
                "lilibo",        // Redis 密码
                0);              // 数据库索引
    }

    public void destroy() {

        if (!(jedisPool == null || jedisPool.isClosed())) {
            jedisPool.close(); // 关闭连接池
        }
    }

    /* -------------------- 示例2 -----------------------------  */


    /**
     * 设置键值对
     *
     * @param key
     * @param value
     * @return
     */
    public boolean set(String key, String value) {

        Jedis jedis = null;

        try {

            jedis = jedisPool.getResource();
            jedis.set(key, value);
            return true;

        } catch (Exception e) {
            e.printStackTrace();
            return false;
        } finally {
            // 返回到连接池
            if (jedis != null) {
                jedis.close();
            }
        }
    }

    /**
     *
     * @param key
     * @param value
     * @param seconds 有效期
     * @return
     */
    public boolean set(String key, String value, int seconds){
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.setex(key,seconds,value);
            return true;

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 返回到连接池
            if (jedis != null) {
                jedis.close();
            }
        }
        return false;
    }

    /**
     * 判断某个key是否存在
     * @param key
     * @return
     */
    public boolean exist(String key){
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            return jedis.exists(key);

        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 返回到连接池
            if (jedis != null) {
                jedis.close();
            }
        }
        return false;
    }

    /**
     *  获取数据
     * @param key
     * @return
     */
    public String get(String key){
        String value = null;
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            value = jedis.get(key);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 返回到连接池
            if (jedis != null) {
                jedis.close();
            }
        }
        return value;
    }

    /**
     * 查询key的有效期，当key不存在时，返回-2 。
     * 当key存在但没有设置剩余时间时放回-1
     * 否则以秒为单位，返回 key
     *
     * @param key
     * @return  剩余多少时间
     */
    public Long ttl(String key){
        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            return jedis.ttl(key);
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            // 返回到连接池
            if (jedis != null) {
                jedis.close();
            }
        }
        return (long) -2;
    }

    /**
     * 删除
     *
     * @param key
     */
    public void delete(String key) {

        Jedis jedis = null;
        try {
            jedis = jedisPool.getResource();
            jedis.del(key);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 返回到连接池
            if (jedis != null) {
                jedis.close();
            }
        }

    }





}
